#include "lru_cache.h"
#include <gtest/gtest.h>
#include <string>

class LRUCacheTest : public ::testing::Test {
protected:
    LRUCache<int, std::string> cache{2};  // 容量2

    void SetUp() override {
        // 初始化放两个键值对
        cache.put(1, "one");
        cache.put(2, "two");
    }
};

// 测试基本的 get 操作和命中
TEST_F(LRUCacheTest, GetExistingKeys) {
    std::string val;
    EXPECT_TRUE(cache.get(1, val));
    EXPECT_EQ(val, "one");

    EXPECT_TRUE(cache.get(2, val));
    EXPECT_EQ(val, "two");
}

// 测试 get 不存在的 key 返回 false
TEST_F(LRUCacheTest, GetNonexistentKey) {
    std::string val;
    EXPECT_FALSE(cache.get(999, val));
}

// 测试 put 更新已有 key 的值，并刷新最近使用
TEST_F(LRUCacheTest, PutUpdatesValue) {
    cache.put(1, "ONE");  // 更新 key=1

    std::string val;
    EXPECT_TRUE(cache.get(1, val));
    EXPECT_EQ(val, "ONE");
}

// 测试容量限制，put 新 key 会淘汰最旧 key
TEST_F(LRUCacheTest, EvictionOnCapacityExceeded) {
    cache.put(3, "three");  // 容量是2，应淘汰最久未使用的 key=1

    std::string val;
    EXPECT_FALSE(cache.get(1, val));   // key=1 被淘汰
    EXPECT_TRUE(cache.get(2, val));  
    EXPECT_EQ(val, "two");
    EXPECT_TRUE(cache.get(3, val));
    EXPECT_EQ(val, "three");
}

// 测试 erase 存在和不存在的 key
TEST_F(LRUCacheTest, EraseKey) {
    EXPECT_TRUE(cache.erase(1));  // 删除存在的 key
    std::string val;
    EXPECT_FALSE(cache.get(1, val));

    EXPECT_FALSE(cache.erase(42));  // 删除不存在的 key 返回 false
}

// 测试清空缓存
TEST_F(LRUCacheTest, ClearCache) {
    cache.clear();

    EXPECT_EQ(cache.size(), 0);
    std::string val;
    EXPECT_FALSE(cache.get(1, val));
    EXPECT_FALSE(cache.get(2, val));
}
